package com.smart.nine.spel.expr.operator;

import com.smart.nine.spel.expr.User;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;

/**
 * 操作符解析
 *
 * @author junrui.wang
 * @create 2019/4/2
 */
public class OperatorExprSample {
    public static void main(String[] args) {
        ExpressionParser expressionParser = new SpelExpressionParser();
        //一、关系操作符
        //1.关系操作符
        Boolean isTrue = expressionParser.parseExpression("2 == 2").getValue(Boolean.class);
        System.out.println(isTrue);
        Boolean isFalse = expressionParser.parseExpression("2 < -2").getValue(Boolean.class);
        System.out.println(isFalse);
        //2.字符串关系比较
        isFalse = expressionParser.parseExpression("'blue' < 'blue'").getValue(Boolean.class);
        System.out.println(isFalse);
        //3.instanceof
        isFalse = expressionParser.parseExpression("'xyz' instanceof T(int)").getValue(Boolean.class);
        System.out.println(isFalse);
        //4.正则匹配运算，前面为字符串，后面为正则表达式
        isTrue = expressionParser.parseExpression("'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
        System.out.println(isTrue);
        isFalse = expressionParser.parseExpression("'5.0067' matches '\\^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
        System.out.println(isFalse);

        //二、逻辑操作符（前后运算结果必须是Java标准的布尔类型，true or 0是错误的）
        User user = new User();
        EvaluationContext context = new StandardEvaluationContext(user);

        //&&操作
        isFalse = expressionParser.parseExpression("true && false").getValue(Boolean.class);
        System.out.println(isFalse);

        isTrue = expressionParser.parseExpression("isVipMember('Tom') && isVipMember('John')").getValue(context, Boolean.class);
        System.out.println(isTrue);

        //||操作
        isTrue = expressionParser.parseExpression("true or false").getValue(Boolean.class);
        System.out.println(isTrue);

        //！操作
        isFalse = expressionParser.parseExpression("!true").getValue(Boolean.class);
        System.out.println(isFalse);

        //三、算术运算操作符（按照Java标准的优先级）
        //加法
        int value = expressionParser.parseExpression("1+1").getValue(Integer.class);
        System.out.println(value);

        //加法
        String string = expressionParser.parseExpression("'a' + 'b'").getValue(String.class);
        System.out.println(string);

        //减法
        value = expressionParser.parseExpression("1 - -3").getValue(Integer.class);
        System.out.println(value);

        //减法
        double doubleValue = expressionParser.parseExpression("1000.00 - 1e4").getValue(Double.class);
        System.out.println(doubleValue);

        //乘法
        value = expressionParser.parseExpression("2 * 3").getValue(Integer.class);
        System.out.println(value);

        //乘法
        doubleValue = expressionParser.parseExpression("2.0 * 4 * 3e0").getValue(Double.class);
        System.out.println(doubleValue);

        //除法
        value = expressionParser.parseExpression("6 / -3").getValue(Integer.class);
        System.out.println(value);

        //除法
        doubleValue = expressionParser.parseExpression("8.0 / 4e0/ 2").getValue(Double.class);
        System.out.println(doubleValue);

        //求余
        value = expressionParser.parseExpression("7 % 4").getValue(Integer.class);
        System.out.println(value);

        //求余
        value = expressionParser.parseExpression("8 / 5 % 2").getValue(Integer.class);
        System.out.println(value);

        //优先级算术运算
        value = expressionParser.parseExpression("1+2-3*8").getValue(Integer.class);
        System.out.println(value);

    }
}
